//
// "$Id: Fl_Repeat_Button.H 9637 2012-07-24 04:37:22Z matt $"
//
// Repeat button header file for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2010 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file.  If this
// file is missing or damaged, see the license at:
//
//     http://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
//     http://www.fltk.org/str.php
//

/* \file
   Fl_Repeat_Button widget . */

#ifndef Fl_Repeat_Button_H
#define Fl_Repeat_Button_H

#include "Fl.H"
#include "Fl_Button.H"

/**
  The Fl_Repeat_Button is a subclass of Fl_Button that
  generates a callback when it is pressed and then repeatedly generates
  callbacks as long as it is held down.  The speed of the repeat is fixed
  and depends on the implementation.
*/
class FL_EXPORT Fl_Repeat_Button : public Fl_Button
{
#define INITIALREPEAT .5
#define REPEAT .1

	static void repeat_callback(void *v)
	{
		Fl_Button *b = (Fl_Button*)v;
		Fl::add_timeout(REPEAT,repeat_callback,b);
		b->do_callback();
	}
public:
	int handle(int event)
	{
		int newval;
		switch (event) {
		case FL_HIDE:
		case FL_DEACTIVATE:
		case FL_RELEASE:
			newval = 0;
			goto J1;
		case FL_PUSH:
		case FL_DRAG:
			if (Fl::visible_focus()) Fl::focus(this);
			newval = Fl::event_inside(this);
J1:
			if (!active())
				newval = 0;
			if (value(newval)) {
				if (newval) {
					Fl::add_timeout(INITIALREPEAT,repeat_callback,this);
					do_callback();
				} else {
					Fl::remove_timeout(repeat_callback,this);
				}
			}
			return 1;
		default:
			return Fl_Button::handle(event);
		}
	}

	/**
	  Creates a new Fl_Repeat_Button widget using the given
	  position, size, and label string. The default boxtype is FL_UP_BOX.
	  Deletes the button.
	*/
	Fl_Repeat_Button(int X,int Y,int W,int H,const char *l=0) : Fl_Button(X,Y,W,H,l) {}

	void deactivate() 
	{
		Fl::remove_timeout(repeat_callback,this);
		Fl_Button::deactivate();
	}
};

#endif

//
// End of "$Id: Fl_Repeat_Button.H 9637 2012-07-24 04:37:22Z matt $".
//
